using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;
using PMServiceDesk.Parameters.Constantes;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.DataAccess
{
    public class DocumentoPaqueteTrabajoData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public DocumentoPaqueteTrabajoData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy,_parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(DocumentoPaqueteTrabajoType documentoPaqueteTrabajo)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (documentoPaqueteTrabajo.Id == null ? "0" : documentoPaqueteTrabajo.Id));
                d.AddParameter("@PAQUETETRABAJOID", documentoPaqueteTrabajo.PaqueteTrabajoId);
                d.AddParameter("@DOCUMENTODIGITALID", documentoPaqueteTrabajo.DocumentoDigitalId);
                d.AddParameter("@ESTADOPAQUETETRABAJOORIGENID", documentoPaqueteTrabajo.EstadoPaqueteTrabajoOrigenId);
                d.AddParameter("@ESTADOPAQUETETRABAJODESTINOID", documentoPaqueteTrabajo.EstadoPaqueteTrabajoDestinoId);
                d.AddParameter("@USUARIOREGISTROID", documentoPaqueteTrabajo.UsuarioRegistroId);
                d.AddParameter("@NOMBREARCHIVO", documentoPaqueteTrabajo.NombreArchivo);
                d.AddParameter("@FECHAREGISTRO", documentoPaqueteTrabajo.FechaRegistro);
                d.AddParameter("@COMENTARIO", documentoPaqueteTrabajo.Comentario);

                documentoPaqueteTrabajo.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public void Eliminar(string id)
        {
            using (DataUtil d = this._eliminar())
            {
                d.AddParameter("@ID", id);

                d.ExecuteNonQuery();
            }
        }

        public DocumentoPaqueteTrabajoType Cargar()
        {
            List<DocumentoPaqueteTrabajoType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<DocumentoPaqueteTrabajoType> CargarLista()
        {
            List<DocumentoPaqueteTrabajoType> l = new List<DocumentoPaqueteTrabajoType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    DocumentoPaqueteTrabajoType o = null;

                    while (r.Read())
                    {
                        o = new DocumentoPaqueteTrabajoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.PaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("PAQUETETRABAJOID")).ToString();
                        o.DocumentoDigitalId = r.GetValue(d.GetOrdinalReader("DOCUMENTODIGITALID")).ToString();
                        o.EstadoPaqueteTrabajoOrigenId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOORIGENID")).ToString();
                        o.EstadoPaqueteTrabajoDestinoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJODESTINOID")).ToString();
                        o.UsuarioRegistroId = r.GetValue(d.GetOrdinalReader("USUARIOREGISTROID")).ToString();
                        o.NombreArchivo = r.GetValue(d.GetOrdinalReader("NOMBREARCHIVO")).ToString();
                        o.FechaRegistro = Convert.ToDateTime(r.GetValue(d.GetOrdinalReader("FECHAREGISTRO")));
                        o.Comentario = r.GetValue(d.GetOrdinalReader("COMENTARIO")).ToString();

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<DocumentoPaqueteTrabajoType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<DocumentoPaqueteTrabajoType> l = new List<DocumentoPaqueteTrabajoType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    DocumentoPaqueteTrabajoType o = null;

                    while (r.Read())
                    {
                        o = new DocumentoPaqueteTrabajoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.PaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("PAQUETETRABAJOID")).ToString();
                        o.DocumentoDigitalId = r.GetValue(d.GetOrdinalReader("DOCUMENTODIGITALID")).ToString();
                        o.EstadoPaqueteTrabajoOrigenId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOORIGENID")).ToString();
                        o.EstadoPaqueteTrabajoOrigen = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOORIGEN")).ToString();
                        o.EstadoPaqueteTrabajoDestinoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJODESTINOID")).ToString();
                        o.EstadoPaqueteTrabajoDestino = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJODESTINO")).ToString();
                        o.EstadoPaqueteTrabajo = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJO")).ToString();
                        o.UsuarioRegistroId = r.GetValue(d.GetOrdinalReader("USUARIOREGISTROID")).ToString();
                        o.UsuarioRegistro = r.GetValue(d.GetOrdinalReader("USUARIOREGISTRO")).ToString();
                        o.NombreArchivo = r.GetValue(d.GetOrdinalReader("NOMBREARCHIVO")).ToString(); 
                        o.FechaRegistro = Convert.ToDateTime(r.GetValue(d.GetOrdinalReader("FECHAREGISTRO")));
                        o.FechaRegistro_Format = ConvertFormat.Date_To_Char(o.FechaRegistro, Formatos.Fecha_DDMMYYYY_hhmmss_tt);
                        o.Comentario = r.GetValue(d.GetOrdinalReader("COMENTARIO")).ToString();

                        l.Add(o);
                    }
                }

            if (l.Count <= _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM DOCUMENTOPAQUETETRABAJO WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO DOCUMENTOPAQUETETRABAJO
                               (
                                   PAQUETETRABAJOID
                                  ,DOCUMENTODIGITALID
                                  ,ESTADOPAQUETETRABAJOORIGENID
                                  ,ESTADOPAQUETETRABAJODESTINOID
                                  ,USUARIOREGISTROID
                                  ,NOMBREARCHIVO
                                  ,FECHAREGISTRO
                                  ,COMENTARIO
                               )
                               VALUES
                               (
                                   @PAQUETETRABAJOID
                                  ,@DOCUMENTODIGITALID
                                  ,@ESTADOPAQUETETRABAJOORIGENID
                                  ,@ESTADOPAQUETETRABAJODESTINOID
                                  ,@USUARIOREGISTROID
                                  ,@NOMBREARCHIVO
                                  ,@FECHAREGISTRO
                                  ,@COMENTARIO
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE DOCUMENTOPAQUETETRABAJO SET
                               PAQUETETRABAJOID=@PAQUETETRABAJOID
                              ,DOCUMENTODIGITALID=@DOCUMENTODIGITALID
                              ,ESTADOPAQUETETRABAJOORIGENID=@ESTADOPAQUETETRABAJOORIGENID
                              ,ESTADOPAQUETETRABAJODESTINOID=@ESTADOPAQUETETRABAJODESTINOID
                              ,USUARIOREGISTROID=@USUARIOREGISTROID
                              ,NOMBREARCHIVO=@NOMBREARCHIVO
                              ,FECHAREGISTRO=@FECHAREGISTRO
                              ,COMENTARIO=@COMENTARIO
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _eliminar()
        {
            string sql = @"DELETE FROM DOCUMENTOPAQUETETRABAJO WHERE ID=@ID";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        DO.ID
                       ,DO.PAQUETETRABAJOID
                       ,DO.DOCUMENTODIGITALID
                       ,DO.ESTADOPAQUETETRABAJOORIGENID
                       ,DO.ESTADOPAQUETETRABAJODESTINOID
                       ,DO.USUARIOREGISTROID
                       ,DO.NOMBREARCHIVO
                       ,DO.FECHAREGISTRO
                       ,DO.COMENTARIO
                        ";

            _join = @"FROM DBO.DOCUMENTOPAQUETETRABAJO [DO] 
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        DO.ID
                        ,DO.PAQUETETRABAJOID
                        ,DO.DOCUMENTODIGITALID
                        ,DO.ESTADOPAQUETETRABAJOORIGENID
                        ,ESTORI.NOMBRE						[ESTADOPAQUETETRABAJOORIGEN]
                        ,DO.ESTADOPAQUETETRABAJODESTINOID
                        ,ESTDES.NOMBRE						[ESTADOPAQUETETRABAJODESTINO]
                        ,(CASE 
                           WHEN DO.ESTADOPAQUETETRABAJODESTINOID IS NULL THEN
                             ESTORI.NOMBRE
                           ELSE
                             ESTORI.NOMBRE + ' - ' + ESTDES.NOMBRE
                         END)								[ESTADOPAQUETETRABAJO]
                        ,DO.USUARIOREGISTROID
                        ,RECREG.NOMBRE						[USUARIOREGISTRO]
                        ,DO.NOMBREARCHIVO
                        ,DO.FECHAREGISTRO
                        ,DO.COMENTARIO
                        ";

            _join = @"FROM DBO.DOCUMENTOPAQUETETRABAJO [DO] 
                    INNER JOIN PAQUETETRABAJO [PAQ] ON PAQ.ID = DO.PAQUETETRABAJOID
                    INNER JOIN ESTADOPAQUETETRABAJO [ESTORI] ON ESTORI.ID = DO.ESTADOPAQUETETRABAJOORIGENID
                    INNER JOIN USUARIORECURSO [USUREG] ON USUREG.USUARIOID = DO.USUARIOREGISTROID
                    INNER JOIN RECURSO [RECREG] ON RECREG.ID = USUREG.RECURSOID AND RECREG.PROYECTOID = PAQ.PROYECTOID
                    LEFT JOIN ESTADOPAQUETETRABAJO [ESTDES] ON ESTDES.ID = DO.ESTADOPAQUETETRABAJODESTINOID
                      ";

            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND DO.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }
        public void FiltrarPorPaqueteTrabajoId(string paqueteTrabajoId)
        {
            _where += @"AND DO.PAQUETETRABAJOID=@PAQUETETRABAJOID
                                 ";

            _parametrosConsulta.Add("@PAQUETETRABAJOID", paqueteTrabajoId);
        }
        public void FiltrarPorEstadoPaqueteTrabajo(string estadoPaqueteTrabajo)
        {
            _where += @"AND (ESTORI.NOMBRE LIKE '%' + @ESTADOPAQUETETRABAJO + '%' OR ESTDES.NOMBRE LIKE '%' + @ESTADOPAQUETETRABAJO + '%')
                                 ";

            _parametrosConsulta.Add("@ESTADOPAQUETETRABAJO", estadoPaqueteTrabajo);
        }
        public void FiltrarPorUsuarioRegistro(string usuarioRegistro)
        {
            _where += @"AND RECREG.NOMBRE LIKE '%' + @USUARIOREGISTRO  + '%'
                                 ";

            _parametrosConsulta.Add("@USUARIOREGISTRO", usuarioRegistro);
        }
        public void FiltrarPorFechaRegistroExacta(DateTime fechaRegistro)
        {
            _where += @"AND CAST(DO.FECHAREGISTRO AS DATE) = @FECHAREGISTROEXACTA
                                 ";

            _parametrosConsulta.Add("@FECHAREGISTROEXACTA", fechaRegistro);
        }
        public void FiltrarPorNombreArchivo(string nombreArchivo)
        {
            _where += @"AND DO.NOMBREARCHIVO LIKE '%' + @NOMBREARCHIVO + '%'
                                 ";

            _parametrosConsulta.Add("@NOMBREARCHIVO", nombreArchivo);
        }


        #endregion
    }
}
